package com.tdam2011.grupo06.gui;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ListActivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;

import com.tdam2011.grupo06.R;
import com.tdam2011.grupo06.control.DatabaseHelper;
import com.tdam2011.grupo06.control.GestorMensajes;
import com.tdam2011.grupo06.gui.PullToRefreshListView.OnRefreshListener;
import com.tdam2011.grupo06.model.Contacto;
import com.tdam2011.grupo06.model.ItemHistorial;
import com.tdam2011.grupo06.model.MensajeBob;

public class ListadoMensajes extends ListActivity implements OnItemClickListener
{
	private LinearLayout linearLay;
	private ItemMensajeAdapter adapter;
	private CargarMensajesTask cargarMensajesTask;
	private GestorMensajes gestorMensajes;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) 
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.lista_mensajes);
		adapter = new ItemMensajeAdapter();
		gestorMensajes = new GestorMensajes(this);
		gestorMensajes.actualizar();
		linearLay = (LinearLayout) findViewById(R.id.linearLayoutListaMensajes);
		setListAdapter(adapter);

		getListView().setOnItemClickListener(this);
		registerForContextMenu(getListView());
		// Set a listener to be invoked when the list should be refreshed.
		((PullToRefreshListView) getListView()).setOnRefreshListener(new OnRefreshListener() {
		    @Override
		    
		    public void onRefresh() {
		    	if(cargarMensajesTask!=null){
		    		cargarMensajesTask.cancel(true);
		    	}
		    	cargarMensajesTask = new CargarMensajesTask();
		    	cargarMensajesTask.execute("");
		    }
		});
		((PullToRefreshListView) getListView()).onRefresh();
	}
	
	@Override
	protected void onPause() 
	{
		super.onPause();
	}

	@Override
	protected void onStop() 
	{
		super.onStop();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) 
	{
	    menu.add(Menu.NONE, 1, Menu.NONE, "Preferencias");
	    menu.add(Menu.NONE, 2, Menu.NONE, "Filtrar por");
	    SubMenu smnuOrd = menu.addSubMenu(Menu.NONE, Menu.NONE, Menu.NONE, "Ordenar por");
	    smnuOrd.add(Menu.NONE, 3, 1, "Fecha ascendente");
	    smnuOrd.add(Menu.NONE, 3, 2, "Fecha descendente");
	    smnuOrd.setGroupCheckable(Menu.NONE, true, true);
	    return true;
	}
	
	@Override
	public boolean onOptionsItemSelected(MenuItem item) 
	{
	    switch (item.getItemId()) 
	    {
	        case 1:
	        	startActivity(new Intent(this, SetPreferenceNombreUsuario.class).putExtra("NoInicio", true));
	            return true;
	        case 2:
	        	startActivityForResult(new Intent(this, SetPreferenceFiltrarMensajes.class),0);
	            return true;
	        case 3:
	        	SharedPreferences myPreference=PreferenceManager.getDefaultSharedPreferences(this);
	        	SharedPreferences.Editor editor = myPreference.edit();
	        	String[] order = getResources().getStringArray(R.array.ordenamietoMensajes);
	        	switch (item.getOrder()) 
	    	    {
	    	        case 1:
	    	        	editor.putString("ordenamietoMensajes", order[0]);
	    	        	adapter.ordenarMensajes(MensajeBob.comparadorFechaAsc);
	    	            break;
	    	        case 2:
	    	        	editor.putString("ordenamietoMensajes", order[1]);
	    	        	adapter.ordenarMensajes(MensajeBob.comparadorFechaDesc);
	    	            break;	    	        
	    	    }
	        	adapter.notifyDataSetChanged();
	            return editor.commit();
	        default:
	            return super.onOptionsItemSelected(item);
	    }
	}
	
	@Override
	public boolean onPrepareOptionsMenu(Menu menu)
	{
		SubMenu smnuOrd = menu.getItem(2).getSubMenu();
		SharedPreferences myPreference=PreferenceManager.getDefaultSharedPreferences(this);
    	String[] order = getResources().getStringArray(R.array.ordenamietoMensajes);
    	String orden = myPreference.getString("ordenamietoMensajes", "");
    	for (int i = 0; i<order.length; i++)
    	{
    		if(order[i].compareTo(orden)==0)
    		{
    			smnuOrd.getItem(i).setChecked(true);
    		}
    	}
	    return true;
	}
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) 
	{
		super.onActivityResult(requestCode, resultCode, data);
		if (requestCode == 0) 
		{
			if (data!=null)
			{
				gestorMensajes.actualizar();
				((PullToRefreshListView) getListView()).onRefresh();
			}
		}
	} 
	public class ItemMensajeAdapter extends BaseAdapter 
	{
		private ArrayList<MensajeBob> itemsMensajes;
		private ArrayList<Contacto> contactos;
		private LayoutInflater inflater;
		private int cantMen;

		public ItemMensajeAdapter() 
		{
			itemsMensajes = new ArrayList<MensajeBob>();
			contactos = new ArrayList<Contacto>();
			inflater = LayoutInflater.from(ListadoMensajes.this);
			cantMen = 0;
		}

		public void addItemBob(MensajeBob info) {
			if (info != null) {
				itemsMensajes.add(info);
				
				if(info instanceof MensajeBob) {cantMen++;}
			}
		}
		
		public void addContacto(Contacto info) {
			if (info != null) {
				contactos.add(info);
			}
		}

		public int getCount() {
			return itemsMensajes.size();
		}

		public Object getItem(int position) {
			return itemsMensajes.get(position);
		}

		public long getItemId(int position) {
			return position;
		}
		
		public Contacto getContactoById(int id) 
		{
			Iterator<Contacto> iter = contactos.iterator();
			Contacto aux;
			while (iter.hasNext())
			{
				aux = iter.next();
				if(aux.getTableID()==id)
				{
					return aux; 
				}
			}
			return null;
		}
		
		public void ordenarMensajes(Comparator<ItemHistorial> comparadorFechaAsc)
		{
			Collections.sort(itemsMensajes, comparadorFechaAsc);
		}
		
			
		public int getCantMen()
		{
			return cantMen;
		}

		public void emptyLists()
		{
			itemsMensajes.clear();
			contactos.clear();
			cantMen = 0;
		}
		
		class Holder 
		{
			private ImageView imgContacto;
			private TextView txtNombre;
			private TextView txtMensaje;
			private TextView txtFecha;
			private TextView txtCantidadDeMensajes;
		}

		public View getView(int position, View convertView, ViewGroup arg2) 
		{
			Holder holder;
			if (convertView == null) 
			{
				convertView = inflater.inflate(R.layout.item_mensaje, null);
				holder = new Holder();
				holder.imgContacto = (ImageView) convertView.findViewById(R.id.imageViewMensajeImagen);
				holder.txtNombre = (TextView) convertView.findViewById(R.id.txtMensajeNombre);
				holder.txtMensaje = (TextView) convertView.findViewById(R.id.txtMensajeContent);
				holder.txtFecha = (TextView) convertView.findViewById(R.id.txtMensajeFecha);
				holder.txtCantidadDeMensajes = (TextView) convertView.findViewById(R.id.txtMensajeCantidadDeMensajes);
				convertView.setTag(holder);
			} 
			else 
			{
				holder = (Holder) convertView.getTag();
			}

			MensajeBob info = (MensajeBob) getItem(position);
			Contacto aux = getContactoById(info.getIdContacto());
			
			if(aux==null)
			{
				holder.imgContacto.setImageDrawable(getResources().getDrawable(R.drawable.ic_contact));
				holder.txtNombre.setText(info.getUsuario());
			}
			else
			{
				holder.imgContacto.setImageURI( aux.getPhotoUri() );
				holder.txtNombre.setText(aux.getNombre()+" ("+info.getUsuario()+")");
			}
			holder.txtMensaje.setText(info.getContent());
			holder.txtFecha.setText(info.getFechaString());
			holder.txtCantidadDeMensajes.setText(Integer.toString(info.getCantidad()));
			if(info.getFueLeido()==MensajeBob.noLeido){
				holder.txtNombre.setTypeface(null, Typeface.BOLD);
				holder.txtMensaje.setTypeface(null, Typeface.BOLD);
				convertView.setBackgroundColor(Color.DKGRAY);
			} else{
				holder.txtNombre.setTypeface(null, Typeface.NORMAL);
				holder.txtMensaje.setTypeface(null, Typeface.NORMAL);
				convertView.setBackgroundColor(Color.BLACK);
			}
			return convertView;
		}
	}
	
	private class CargarMensajesTask extends AsyncTask<String, Void, ItemMensajeAdapter>
	{
		@Override
		protected ItemMensajeAdapter doInBackground(String... params) 
		{
			boolean flag = gestorMensajes.verificarMensajes(adapter);
			
			if(flag)
			{
				adapter.emptyLists();
				return gestorMensajes.cargarMensajes(adapter);
			}
			return null;
		}
		
		protected void onPostExecute(ItemMensajeAdapter result)
		{
			if(result!=null)
			{
				adapter = result;
				adapter.notifyDataSetChanged();
			}
			
			if(linearLay.getVisibility()!=View.GONE){
	    		linearLay.setVisibility(View.GONE);
	    	}			
			if(adapter.isEmpty()){
    			((PullToRefreshListView) getListView()).onRefreshComplete(getResources().getString(R.string.empty_listMensajes));
    		}
    		else{
    			((PullToRefreshListView) getListView()).onRefreshComplete(null);
    		}
	        super.onPostExecute(result);
		}
	}
	
	protected Dialog onCreateDialog(int id) 
	{
		Dialog dialog = null;
		if (id ==1) 
		{
			dialog = new AlertDialog.Builder(this).setIcon(R.drawable.ic_alert).setPositiveButton("Ok", null).setMessage("Todavia no se ha cargado los mensajes").setTitle("Error").create();
		} 
		else 
		{
			dialog = super.onCreateDialog(id);
		}
		return dialog;
	}
	
	@Override
	public void onBackPressed() 
	{
		super.onBackPressed();
	}

	public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) 
	{
		MensajeBob mb = (MensajeBob) adapter.getItem(position - 1);
		Contacto c = new Contacto();
		c.setUsuario(mb.getUsuario());
		c = DatabaseHelper.getInstance(this).getContactByUser(c);
    	startActivityForResult(new Intent(this, ListadoMensajesBob.class).putExtra("idContacto", c.getTableID()),0);
	}
	
	public class BobMessageReceiver extends BroadcastReceiver {
		 
	    @Override
	    public void onReceive(Context context, Intent intent) {
	        Intent service = new Intent(context, com.tdam2011.grupo06.control.BobMessageService.class);
	        context.startService(service);
	    }
	}
}
